class bit_32:
    def __init__(self, x=0):
        self.val = x & 0xffffffff

    def update(self):
        self.val = self.val & 0xffffffff

    def __get__(self):
        self.update()
        return self.val

    def __set__(self, instance, value):
        self.val = value
        self.update()

    def __setitem__(self, index, value):
        if value:
            self.val = self.val | (value << index)
        else:
            self.val = self.val & ~(value << index)
        self.update()

    def __getitem__(self, index):
        self.update()
        if self.val & (1 << index):
            return 1
        else:
            return 0


class bit_64:
    def __init__(self, x=0):
        self.val = x & 0xffffffffffffffff

    def update(self):
        self.val = self.val & 0xffffffffffffffff

    def __get__(self):
        self.update()
        return self.val

    def __set__(self, instance, value):
        self.val = value
        self.update()

    def __setitem__(self, index, value):
        if value:
            self.val = self.val | (value << index)
        else:
            self.val = self.val & ~(value << index)
        self.update()

    def __getitem__(self, index):
        self.update()
        if self.val & (1 << index):
            return 1
        else:
            return 0


def get_bit(item, index):
    if item & (1 << index):
        return 1
    else:
        return 0


def get_seg(item, left, right):
    len = left - right + 1
    return (item >> left) % (1 << len)


class bit_16:
    def __init__(self, x=0):
        self.bits = x & 0xffff

    def update(self):
        self.bits &= 0xffff

    def __get__(self):
        self.update()
        return self.bits

    def __set__(self, instance, value):
        self.bits = value
        self.update()


class byte:
    def __init__(self, x=0):
        self.val = x & 0xff

    def update(self):
        self.val &= 0xff

    def __get__(self):
        self.update()
        return self.val

    def __set__(self, instance, value):
        self.val = value
        self.update()


def byte_to_bit16(byte1, byte0):
    return (byte1 << 8) | byte0


def bit16_to_byte(bits):
    byte1 = (bits >> 8) & 0xff
    byte0 = bits & 0xff
    return byte1, byte0


def byte_to_bit32(byte3, byte2, byte1, byte0):
    bit16_1 = byte_to_bit16(byte3, byte2)
    bit16_0 = byte_to_bit16(byte1, byte0)
    return (bit16_1 << 16) | bit16_0


def bit32_to_byte(bits):
    bit16_1 = (bits >> 16) & 0xffff
    bit16_0 = bits & 0xffff
    byte3, byte2 = bit16_to_byte(bit16_1)
    byte1, byte0 = bit16_to_byte(bit16_0)
    return byte3, byte2, byte1, byte0


def bit64_to_byte(bits):
    bit32_1 = (bits >> 32) & 0xffffffff
    bit32_0 = bits & 0xffffffff
    byte7, byte6, byte5, byte4 = bit32_to_byte(bit32_1)
    byte3, byte2, byte1, byte0 = bit32_to_byte(bit32_0)
    return byte7, byte6, byte5, byte4, byte3, byte2, byte1, byte0


def byte_to_bit64(byte7, byte6, byte5, byte4, byte3, byte2, byte1, byte0):
    bit32_1 = byte_to_bit32(byte7, byte6, byte5, byte4)
    bit32_0 = byte_to_bit32(byte3, byte2, byte1, byte0)
    return (bit32_1 << 32) | bit32_0

